package com.cskaoyan.javase.oop2._1extends._7initialization._1basic;
/**
 * 子类对象初始化时的细节问题/注意事项:
 *      1.子类对象在创建时,只会创建子类对象.这个过程中,虽然父类的构造器执行了
 *          但构造器本身的作用就是在创建对象过程中赋值
 *          子类构造器给自身成员赋值,父类构造器给父类成员赋值
 *          这个过程不会创建父类对象
 *
 *      2.子类对象的隐式初始化依赖于父类的无参构造器,如果父类没有无参构造,那么子类就不能隐式初始化
 *              必须显示初始化,必须直接的调用父类的某个有参构造器,否则会编译报错
 *              当然,顺手给一个类提供无参构造器是一个好习惯:
 *                  1.一方面给子类用
 *                  2.另一方面要给某些框架使用
 *
 *      3.super关键字和this关键字在表示调用构造器时,必须在第一行代码
 *          原因: 避免重复多次调用父类的构造器
 *          当然既然都要争第一行,显然不可能一起使用
 *
 *
 *     4.如果构造器中有this调整自身构造器,那么还会先执行父类构造器吗?
 *     肯定是可以,因为子类中肯定有一个构造器要调用父类构造器
 *
 * @since 15:13
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Son s = new Son(1, 2, 3);
        Son s2 = new Son(1, 2, 3, 4);
    }
}
class Father{
    int num;

    public Father(int num) {
        this.num = num;
    }

    public Father() {
    }
}
class Son extends Father{
    int a;
    int b;
    int c;

    public Son() {
    }

    public Son(int a){
        this();
        this.a = a;
    }

    public Son(int a, int b, int c) {
        this(a);
        this.b = b;
        this.c = c;
    }

    public Son(int num, int a, int b, int c) {
        super(num);
        this.a = a;
        this.b = b;
        this.c = c;
    }
}